home *** CD-ROM | disk | FTP | other *** search
-
-
-
- CMD ___
-
-
-
- 1.0 OVERVIEW
-
- The CMD package makes it very easy for MACRO programs use
- the COMND JSYS in order to provide the MACRO program's user
- to be able to type TOPS20 style commands to the program,
- including all standard TOPS20 features such as recognition,
- question mark, CTRL/H etc.
-
- The CMD package is a valuable tool several reasons,
- uncluding:
-
- 1) The programmer needn't allocate any special COMND
- JSYS buffers and blocks.
-
- 2) The programmer needn't provide initialization code
- to set up pointers and blocks for the COMND JSYS.
-
- 3) The programmer needn't provide special code to
- handle "cleaning up" associated with reparsing and
- error returns.
-
- In general, all the program must do when using CMD, is
- supply the field-specific data for the individual parts of
- the command being parsed. CMD does most of the rest.
-
-
-
- 2.0 NONGOAL
-
- The CMD package does not attempt to provide any method of
- generating entire command languages, such as structure
- trees. It only provides primitives from which such things
- as structure trees may be designed.
-
-
-
- 3.0 SAMPLE RUN
-
- The following is a typescript of the running of a program
- called CMTEST, which features two commands, EXIT and RENAME.
- The program uses the CMD package.
-
- @RUN CMTEST
- CMTEST>? ONE OF THE FOLLOWING:
- EXIT RENAME
- CMTEST>RENAME (EXISTING FILE) FOO.ERT.1 (TO BE) ZOT.BAR
- CMTEST>EXIT ? CONFIRM WITH CARRIAGE RETURN
- CMTEST>EXIT
- @
- Page 2
-
-
- 4.0 PROGRAM LISTING
-
- The following program listing shows how the CMD package is
- utilized to implement commands.
-
- title CMTEST
- search monsym,macsym,CMD
- .require sys:macrel,sys:CMD
-
- beg: RESET
- MOVEI P,PDL-1 ;SET UP STACK
- CALL CMDINI ;INITIALIZE COMND JSYS
- LUP: PROMPT (CMTEST>) ;PROMPT FOR COMMAND
- MOVEI A,[FLDDB. .CMKEY,,WRDLST] ;SPECIFY WE WANT A KEYWORD
- CALL RFIELD ;READ COMMAND
- MOVE A,(B) ;GET ADDRESS OF COMMAND ROUTINE
- CALL (A) ;EXECUTE THE COMMAND
- JRST LUP ;GO GET NEXT COMMAND
-
- .EXIT: CONFRM ;WAIT FOR END OF LINE
- HALTF ;EXIT COMMAND CAUSES STOP
- RET ;GET NEXT COMMAND IF CONTINUE
-
- .RENAM: NOISE (EXISTING FILE)
- MOVEI A,[FLDDB. .CMIFI] ;SPECIFY INPUT FILE
- CALL RFIELD ;GET FILE NAME BEING RENAMED
- MOVEM B,IJFN ;REMEMBER IT
- NOISE (TO BE)
- MOVEI A,[FLDDB. .CMOFI] ;SPECIFY OUTPUT FILE
- CALL CFIELD ;GET NEW NAME AND END OF COMMAND
- MOVEM B,OJFN
- MOVE A,IJFN ;GET OLD NAME
- RNAMF ;RENAME THE FILE
- JSERR ;REPORT IF ERROR
- MOVE A,OJFN ;GET RID OF JFN
- RLJFN
- JSERR ;REPORT IF ERROR
- RET ;GO BACK FOR NEXT COMMAND
-
- wrdlst: n,,n
- t EXIT
- T RENAME
- n==.-wrdlst-1
-
- CMDSTG ;ALLOCATE COMND JSYS STORAGE
- IJFN: 0 ;INPUT FILE
- OJFN: 0 ;OUTPUT FILE
- PDL: BLOCK 200 ;STACK SPACE
-
- END BEG
- Page 3
-
-
- 5.0 SPECIFIC FEATURES AVAILABLE WITH CMD
-
- 5.1 Telling MACRO And LINK That You Are Using The Package
-
- Include the following two statements near the beginning of
- your source code.
-
- SEARCH CMD
- .REQUIRE SYS:CMD
-
- These two statements make the CMD package available to your
- program.
-
-
-
- 5.2 Initializing Your Program To Input Commands
-
- Before prompting for the first command in the program,
- execute the following call:
-
- CALL CMDINI
-
- The CMDINI routine should be called only once per running of
- the program.
-
-
-
- 5.3 Allocating Storage For The Command Database
-
- The following statement causes the database for the COMND
- JSYS to be reserved.
-
- CMDSTG
-
- Put this statement somewhere in your variable area of your
- program.
-
-
-
- 5.4 Prompting For A Command
-
- To prompt for a command, or new line of a command, use the
- PROMPT macro, like this:
-
- PROMPT (FOO)
-
- The PROMPT macro causes the text in parentheses to be output
- as the prompt for the command line.
- Page 4
-
-
- 5.5 Reading A Field Of A Command
-
- Load AC1 with the address of a COMND JSYS function block and
- call the RFIELD routine. The following example shows how to
- read an input filespec:
-
- MOVEI A,[FLDDB. .CMIFI]
- CALL RFIELD
-
- The RFIELD routine returns with the result of the COMND JSYS
- in AC1 and AC2. For the above example, a JFN would be
- returned in AC2. The RFIELD routine handles all details
- such as reparsing and errors.
-
-
-
- 5.6 Inputting The End Of The Command
-
- To require the typist to end the command line at a
- particular point, use the CONFRM macro, like this:
-
- CONFRM
-
-
-
-
- 5.7 Inputting A Field Of A Command Followed By End Of Line
-
- Since it is common to input a field followed by end of line,
- the CFIELD routine is supplied, which is exactly like
- RFIELD, except it inputs end of line after the field. The
- call is as follows:
-
- CALL CFIELD
-
-
-
- 5.8 Guide Words
-
- To put guide words in a command, make the following call:
-
- NOISE (words)
-
- The NOISE macro causes whatever text is in the parentheses
- to be used as the guide words.
-
-
-
- 5.9 Keyword Table Entries
-
- A macro called T is available to make it easy to assemble
- keyword table entries. The format is
-
- T word,data
- Page 5
-
-
- where "word" is the keyword, and "data" is specific data for
- the keyword. The T macro creates a word in memory whose
- left half points to the ASCIZ representation of the word,
- and whose right half points to a word containing the data.
-
- The "data" argument defaults to ".word". Hence in the
- common case, where the data for a keyword is the macro tag
- for the suuport code for that keyword, the call may be given
- like this:
-
- T word
-
- This call requires you to have the support code for the
- specified word elsewhere in your program, like this:
-
- .word: code
- . . .
- . . .
- . . .
-
-
-
-
- 5.10 Special Other Details
-
- The FLDDB. macro (defined in MONSYM), and the chaining
- facility of function descriptor blocks generally provides
- enough flexibility for creativity of command language
- designs. However, for the more devious, the following is
- revealed:
-
-
-
- 5.10.1 Error Processing - If a user error is made, the CMD
- module normally prints an error message and allows the user
- to correct the mistake (with ^H) or issue another command.
- If you want your program to do its own error processing, you
- may call a routine called RFLDE instead of RFIELD. RFLDE
- has an error return, like this:
-
- CALL RFLDE
- ;+1 return means error
- ;+2 return means success
-
- Your error return should transfer off to code which prints
- some sort of error message. Then transfer to CMDER1, like
- this:
-
- JRST CMDER1
-
- CMDER1 takes responsibility for reprompting for the command
- line on which the error occured, and allowing the user to
- correct or retype the erroneous line.
- Page 6
-
-
- 5.10.2 GTJFN Block - The GTJFN argument block is called
- CJFNBK. Note that to set up a default filespec, you merely
- need to put a pointer to the default spec in the function
- descriptor block, so for setting up defaults, you don't need
- to explicitly reference CJFNBK.
-
-
-
- 5.10.3 Command State Block - The COMND JSYS's command state
- block is called SBK. Since the CMDINI routine sets it up,
- you normally shouldn't have to reference it.
-
-
-
- 5.10.4 Custom Prompting - Sometimes, the prompt for a
- command wants to be computed during the running of the
- program. For instance, a game program might want to type
-
- YOUR FIFTH MOVE:
-
- as its prompt. For this case, the PROMPT macro isn't
- sufficient.
-
- The general prompting routine is call DPROMPT. It is
- important that your program call it, or use the PROMPT
- macro. Otherwise, reparsing (the magic that happens when
- typist deletes parsed characters) won't happen correctly.
- That is, don't just call RFIELD with the .CMINI function!
-
- For the above example, suppose the game program had created
- the desired string and stored it in an area of memory tagged
- with MOVMES. The program may type the prompt like this:
-
- HRROI A,MOVMES
- CALL DPROMPT
-
- The DPROMPT routine assumes A contains a pointer to the
- prompt string.
-